<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>[基础]JavaWeb(Servlet+JSP) | Plana(方案A)</title>
    <meta name="generator" content="VuePress 1.5.2">
    <link rel="icon" href="https://luo0412.gitee.io/static/images/logo/favicon.ico">
    <script src="http://apps.bdimg.com/libs/jquery/1.11.3/jquery.min.js"></script>
    <script>$(function () {
    $(".navbar .dropdown-wrapper .title").each(function (index, item) {
        var title = $(item).text() || ""
        console.log(title)
        var index = title.indexOf("(")
        if (index > -1) {
            $(item).text(title.slice(0, index))
        }
    })
})

((window.gitter = {}).chat = {}).options = {
    room: 'luo0412/plana'
};</script>
    <script src="https://sidecar.gitter.im/dist/sidecar.v1.js"></script>
    <meta name="description" content="方案A">
    <link rel="preload" href="/plana/assets/css/0.styles.e9cba6b3.css" as="style"><link rel="preload" href="/plana/assets/js/app.26a35d46.js" as="script"><link rel="preload" href="/plana/assets/js/2.b5bc497d.js" as="script"><link rel="preload" href="/plana/assets/js/81.c563629a.js" as="script"><link rel="prefetch" href="/plana/assets/js/10.76967f04.js"><link rel="prefetch" href="/plana/assets/js/100.5188df2c.js"><link rel="prefetch" href="/plana/assets/js/101.d84c20f9.js"><link rel="prefetch" href="/plana/assets/js/102.dcbad92b.js"><link rel="prefetch" href="/plana/assets/js/103.cbf31594.js"><link rel="prefetch" href="/plana/assets/js/104.227d809c.js"><link rel="prefetch" href="/plana/assets/js/105.4690789d.js"><link rel="prefetch" href="/plana/assets/js/106.76527743.js"><link rel="prefetch" href="/plana/assets/js/107.d6e3a4d6.js"><link rel="prefetch" href="/plana/assets/js/108.6e4c8bfc.js"><link rel="prefetch" href="/plana/assets/js/109.fc12471e.js"><link rel="prefetch" href="/plana/assets/js/11.569e93dd.js"><link rel="prefetch" href="/plana/assets/js/110.85c3d834.js"><link rel="prefetch" href="/plana/assets/js/111.9c605bc7.js"><link rel="prefetch" href="/plana/assets/js/112.12b9e5d6.js"><link rel="prefetch" href="/plana/assets/js/113.21ac7878.js"><link rel="prefetch" href="/plana/assets/js/114.e4dd9de7.js"><link rel="prefetch" href="/plana/assets/js/115.8600fa46.js"><link rel="prefetch" href="/plana/assets/js/116.043898d2.js"><link rel="prefetch" href="/plana/assets/js/117.5c6253ed.js"><link rel="prefetch" href="/plana/assets/js/118.0deaa07b.js"><link rel="prefetch" href="/plana/assets/js/119.0e1b78e7.js"><link rel="prefetch" href="/plana/assets/js/12.f97471e0.js"><link rel="prefetch" href="/plana/assets/js/120.da2dcbe4.js"><link rel="prefetch" href="/plana/assets/js/121.b67072a1.js"><link rel="prefetch" href="/plana/assets/js/122.4438dfd8.js"><link rel="prefetch" href="/plana/assets/js/123.ffb881d0.js"><link rel="prefetch" href="/plana/assets/js/124.ae643d5d.js"><link rel="prefetch" href="/plana/assets/js/125.782ff172.js"><link rel="prefetch" href="/plana/assets/js/126.9cb23b0a.js"><link rel="prefetch" href="/plana/assets/js/127.2c5e040e.js"><link rel="prefetch" href="/plana/assets/js/128.f96c3297.js"><link rel="prefetch" href="/plana/assets/js/129.379dad87.js"><link rel="prefetch" href="/plana/assets/js/13.40058c53.js"><link rel="prefetch" href="/plana/assets/js/130.f350d8cd.js"><link rel="prefetch" href="/plana/assets/js/131.9b494f44.js"><link rel="prefetch" href="/plana/assets/js/132.8a6c409e.js"><link rel="prefetch" href="/plana/assets/js/133.c691db55.js"><link rel="prefetch" href="/plana/assets/js/134.e8d8a94a.js"><link rel="prefetch" href="/plana/assets/js/135.c95a1ef6.js"><link rel="prefetch" href="/plana/assets/js/136.bdd4250b.js"><link rel="prefetch" href="/plana/assets/js/137.539d6db6.js"><link rel="prefetch" href="/plana/assets/js/138.c16e3cc1.js"><link rel="prefetch" href="/plana/assets/js/139.7a1243ca.js"><link rel="prefetch" href="/plana/assets/js/14.880c2d4f.js"><link rel="prefetch" href="/plana/assets/js/140.6ed0a182.js"><link rel="prefetch" href="/plana/assets/js/141.a984158d.js"><link rel="prefetch" href="/plana/assets/js/142.e094f73f.js"><link rel="prefetch" href="/plana/assets/js/143.760a5510.js"><link rel="prefetch" href="/plana/assets/js/144.212ede62.js"><link rel="prefetch" href="/plana/assets/js/145.2e06e4c9.js"><link rel="prefetch" href="/plana/assets/js/146.16713494.js"><link rel="prefetch" href="/plana/assets/js/147.7b0585c3.js"><link rel="prefetch" href="/plana/assets/js/148.ae82990b.js"><link rel="prefetch" href="/plana/assets/js/149.73a7c703.js"><link rel="prefetch" href="/plana/assets/js/15.5364aa14.js"><link rel="prefetch" href="/plana/assets/js/150.fec18e0b.js"><link rel="prefetch" href="/plana/assets/js/151.14bf6cea.js"><link rel="prefetch" href="/plana/assets/js/152.17f17b04.js"><link rel="prefetch" href="/plana/assets/js/153.ba7c5f21.js"><link rel="prefetch" href="/plana/assets/js/154.d3340db4.js"><link rel="prefetch" href="/plana/assets/js/155.2bf1dbde.js"><link rel="prefetch" href="/plana/assets/js/156.70d23de7.js"><link rel="prefetch" href="/plana/assets/js/157.93a62465.js"><link rel="prefetch" href="/plana/assets/js/158.bf486b60.js"><link rel="prefetch" href="/plana/assets/js/159.f19e7955.js"><link rel="prefetch" href="/plana/assets/js/16.e96c9bd3.js"><link rel="prefetch" href="/plana/assets/js/160.3dc61d59.js"><link rel="prefetch" href="/plana/assets/js/161.0fff4227.js"><link rel="prefetch" href="/plana/assets/js/162.70526488.js"><link rel="prefetch" href="/plana/assets/js/163.faa79f0a.js"><link rel="prefetch" href="/plana/assets/js/164.9c80b5bb.js"><link rel="prefetch" href="/plana/assets/js/165.7f9b0124.js"><link rel="prefetch" href="/plana/assets/js/166.36435978.js"><link rel="prefetch" href="/plana/assets/js/167.feea7028.js"><link rel="prefetch" href="/plana/assets/js/168.cc504d5f.js"><link rel="prefetch" href="/plana/assets/js/169.ec7d4b8a.js"><link rel="prefetch" href="/plana/assets/js/17.07c08387.js"><link rel="prefetch" href="/plana/assets/js/170.a8b4b58d.js"><link rel="prefetch" href="/plana/assets/js/171.2329fa88.js"><link rel="prefetch" href="/plana/assets/js/172.286ac28f.js"><link rel="prefetch" href="/plana/assets/js/173.a692852e.js"><link rel="prefetch" href="/plana/assets/js/174.a39922f0.js"><link rel="prefetch" href="/plana/assets/js/175.b47f1b23.js"><link rel="prefetch" href="/plana/assets/js/176.86486ead.js"><link rel="prefetch" href="/plana/assets/js/177.40f1c5b7.js"><link rel="prefetch" href="/plana/assets/js/178.7a9ca10d.js"><link rel="prefetch" href="/plana/assets/js/179.19051ac2.js"><link rel="prefetch" href="/plana/assets/js/18.e433f8d3.js"><link rel="prefetch" href="/plana/assets/js/180.57d0c928.js"><link rel="prefetch" href="/plana/assets/js/181.00da0f3d.js"><link rel="prefetch" href="/plana/assets/js/182.cadb79df.js"><link rel="prefetch" href="/plana/assets/js/183.8dd3881a.js"><link rel="prefetch" href="/plana/assets/js/184.1222a110.js"><link rel="prefetch" href="/plana/assets/js/185.7d9330c8.js"><link rel="prefetch" href="/plana/assets/js/186.d6ddbb60.js"><link rel="prefetch" href="/plana/assets/js/187.f19bfcc2.js"><link rel="prefetch" href="/plana/assets/js/188.b801053a.js"><link rel="prefetch" href="/plana/assets/js/189.9bf68bd8.js"><link rel="prefetch" href="/plana/assets/js/19.0f82fe28.js"><link rel="prefetch" href="/plana/assets/js/190.158c0b50.js"><link rel="prefetch" href="/plana/assets/js/191.cdca9aef.js"><link rel="prefetch" href="/plana/assets/js/192.84164400.js"><link rel="prefetch" href="/plana/assets/js/193.6fee8315.js"><link rel="prefetch" href="/plana/assets/js/194.646a3bc9.js"><link rel="prefetch" href="/plana/assets/js/195.f63862f4.js"><link rel="prefetch" href="/plana/assets/js/196.4b0d972c.js"><link rel="prefetch" href="/plana/assets/js/197.e706ce3c.js"><link rel="prefetch" href="/plana/assets/js/198.8b9720bf.js"><link rel="prefetch" href="/plana/assets/js/199.49a5e793.js"><link rel="prefetch" href="/plana/assets/js/20.619cb712.js"><link rel="prefetch" href="/plana/assets/js/200.ef546dd9.js"><link rel="prefetch" href="/plana/assets/js/201.479054ec.js"><link rel="prefetch" href="/plana/assets/js/202.0b3389ee.js"><link rel="prefetch" href="/plana/assets/js/203.22150890.js"><link rel="prefetch" href="/plana/assets/js/204.2dc71336.js"><link rel="prefetch" href="/plana/assets/js/205.e377c245.js"><link rel="prefetch" href="/plana/assets/js/206.1ace4feb.js"><link rel="prefetch" href="/plana/assets/js/207.323fa10a.js"><link rel="prefetch" href="/plana/assets/js/208.e353a6ec.js"><link rel="prefetch" href="/plana/assets/js/209.316ac6f0.js"><link rel="prefetch" href="/plana/assets/js/21.d91a849c.js"><link rel="prefetch" href="/plana/assets/js/210.d4f18535.js"><link rel="prefetch" href="/plana/assets/js/211.573c492b.js"><link rel="prefetch" href="/plana/assets/js/212.b2a16387.js"><link rel="prefetch" href="/plana/assets/js/213.c2fac0b1.js"><link rel="prefetch" href="/plana/assets/js/214.79b62576.js"><link rel="prefetch" href="/plana/assets/js/215.fe6c3e10.js"><link rel="prefetch" href="/plana/assets/js/216.18f410e2.js"><link rel="prefetch" href="/plana/assets/js/217.20c9e9eb.js"><link rel="prefetch" href="/plana/assets/js/218.a0eeeb7c.js"><link rel="prefetch" href="/plana/assets/js/219.b956aca7.js"><link rel="prefetch" href="/plana/assets/js/22.366fc766.js"><link rel="prefetch" href="/plana/assets/js/220.5ed5e277.js"><link rel="prefetch" href="/plana/assets/js/221.468f9087.js"><link rel="prefetch" href="/plana/assets/js/222.638dc5f6.js"><link rel="prefetch" href="/plana/assets/js/223.0fad689f.js"><link rel="prefetch" href="/plana/assets/js/224.61ad16fd.js"><link rel="prefetch" href="/plana/assets/js/225.91089e6c.js"><link rel="prefetch" href="/plana/assets/js/226.2f0d158a.js"><link rel="prefetch" href="/plana/assets/js/227.43288d9d.js"><link rel="prefetch" href="/plana/assets/js/228.4bff0625.js"><link rel="prefetch" href="/plana/assets/js/229.9c3666b2.js"><link rel="prefetch" href="/plana/assets/js/23.d2ecdcc9.js"><link rel="prefetch" href="/plana/assets/js/230.b52057f9.js"><link rel="prefetch" href="/plana/assets/js/231.cc0ed124.js"><link rel="prefetch" href="/plana/assets/js/232.9ad374c5.js"><link rel="prefetch" href="/plana/assets/js/233.d794c11f.js"><link rel="prefetch" href="/plana/assets/js/234.26ac8fbc.js"><link rel="prefetch" href="/plana/assets/js/235.41250663.js"><link rel="prefetch" href="/plana/assets/js/236.881374a2.js"><link rel="prefetch" href="/plana/assets/js/237.c7bd84e0.js"><link rel="prefetch" href="/plana/assets/js/238.98726af2.js"><link rel="prefetch" href="/plana/assets/js/239.9f11e102.js"><link rel="prefetch" href="/plana/assets/js/24.02b55c75.js"><link rel="prefetch" href="/plana/assets/js/240.a7cac4ef.js"><link rel="prefetch" href="/plana/assets/js/241.462a960b.js"><link rel="prefetch" href="/plana/assets/js/242.7cf42754.js"><link rel="prefetch" href="/plana/assets/js/243.b3d1619f.js"><link rel="prefetch" href="/plana/assets/js/244.40da516b.js"><link rel="prefetch" href="/plana/assets/js/245.ada0c168.js"><link rel="prefetch" href="/plana/assets/js/246.38614800.js"><link rel="prefetch" href="/plana/assets/js/247.491612a2.js"><link rel="prefetch" href="/plana/assets/js/248.23741832.js"><link rel="prefetch" href="/plana/assets/js/249.90624a3a.js"><link rel="prefetch" href="/plana/assets/js/25.96e9e495.js"><link rel="prefetch" href="/plana/assets/js/250.f5946779.js"><link rel="prefetch" href="/plana/assets/js/251.58091edf.js"><link rel="prefetch" href="/plana/assets/js/252.fbe32ae4.js"><link rel="prefetch" href="/plana/assets/js/253.1cdd8f1c.js"><link rel="prefetch" href="/plana/assets/js/254.651e7bc6.js"><link rel="prefetch" href="/plana/assets/js/255.58aaa830.js"><link rel="prefetch" href="/plana/assets/js/256.08653b0a.js"><link rel="prefetch" href="/plana/assets/js/257.18da3dda.js"><link rel="prefetch" href="/plana/assets/js/258.e639b138.js"><link rel="prefetch" href="/plana/assets/js/259.9a2ccdd8.js"><link rel="prefetch" href="/plana/assets/js/26.786f768e.js"><link rel="prefetch" href="/plana/assets/js/260.1ffec687.js"><link rel="prefetch" href="/plana/assets/js/261.6f007b8c.js"><link rel="prefetch" href="/plana/assets/js/262.eebd1210.js"><link rel="prefetch" href="/plana/assets/js/263.1672d254.js"><link rel="prefetch" href="/plana/assets/js/264.a786f2f0.js"><link rel="prefetch" href="/plana/assets/js/265.b08f361a.js"><link rel="prefetch" href="/plana/assets/js/266.6b9c1b18.js"><link rel="prefetch" href="/plana/assets/js/267.05341052.js"><link rel="prefetch" href="/plana/assets/js/268.2b47894a.js"><link rel="prefetch" href="/plana/assets/js/269.b00e1745.js"><link rel="prefetch" href="/plana/assets/js/27.d95cd926.js"><link rel="prefetch" href="/plana/assets/js/270.f09aa40d.js"><link rel="prefetch" href="/plana/assets/js/271.036eefbf.js"><link rel="prefetch" href="/plana/assets/js/272.685451a2.js"><link rel="prefetch" href="/plana/assets/js/273.489debcf.js"><link rel="prefetch" href="/plana/assets/js/274.3f824bc5.js"><link rel="prefetch" href="/plana/assets/js/275.d3661899.js"><link rel="prefetch" href="/plana/assets/js/276.0dd18e5e.js"><link rel="prefetch" href="/plana/assets/js/277.1ec17e71.js"><link rel="prefetch" href="/plana/assets/js/278.6379871f.js"><link rel="prefetch" href="/plana/assets/js/279.a0692e92.js"><link rel="prefetch" href="/plana/assets/js/28.c63f738d.js"><link rel="prefetch" href="/plana/assets/js/280.34932565.js"><link rel="prefetch" href="/plana/assets/js/281.ae742fd5.js"><link rel="prefetch" href="/plana/assets/js/282.715175d9.js"><link rel="prefetch" href="/plana/assets/js/283.9b6a3e34.js"><link rel="prefetch" href="/plana/assets/js/284.00628265.js"><link rel="prefetch" href="/plana/assets/js/285.3de0dd73.js"><link rel="prefetch" href="/plana/assets/js/286.6a2d6c2a.js"><link rel="prefetch" href="/plana/assets/js/287.74cdf243.js"><link rel="prefetch" href="/plana/assets/js/288.42fdbe73.js"><link rel="prefetch" href="/plana/assets/js/289.f4afe8dc.js"><link rel="prefetch" href="/plana/assets/js/29.84c2f6be.js"><link rel="prefetch" href="/plana/assets/js/290.6fad3c29.js"><link rel="prefetch" href="/plana/assets/js/291.b0ad0381.js"><link rel="prefetch" href="/plana/assets/js/292.888b58ac.js"><link rel="prefetch" href="/plana/assets/js/293.1ed605a6.js"><link rel="prefetch" href="/plana/assets/js/294.3af3dec3.js"><link rel="prefetch" href="/plana/assets/js/295.db08edcf.js"><link rel="prefetch" href="/plana/assets/js/296.e4837fb2.js"><link rel="prefetch" href="/plana/assets/js/297.25eb8cb6.js"><link rel="prefetch" href="/plana/assets/js/298.4948e1d0.js"><link rel="prefetch" href="/plana/assets/js/299.56ff4927.js"><link rel="prefetch" href="/plana/assets/js/3.27803fd3.js"><link rel="prefetch" href="/plana/assets/js/30.a9337659.js"><link rel="prefetch" href="/plana/assets/js/300.8dad7bd4.js"><link rel="prefetch" href="/plana/assets/js/301.1d0bd3b7.js"><link rel="prefetch" href="/plana/assets/js/302.24c7060b.js"><link rel="prefetch" href="/plana/assets/js/303.a4a7908d.js"><link rel="prefetch" href="/plana/assets/js/304.d5a32c16.js"><link rel="prefetch" href="/plana/assets/js/305.eb22a5e4.js"><link rel="prefetch" href="/plana/assets/js/306.cdaa56b9.js"><link rel="prefetch" href="/plana/assets/js/307.f7e38353.js"><link rel="prefetch" href="/plana/assets/js/308.3f3f49e6.js"><link rel="prefetch" href="/plana/assets/js/309.ba1c34b9.js"><link rel="prefetch" href="/plana/assets/js/31.f4ff74a7.js"><link rel="prefetch" href="/plana/assets/js/310.06e88629.js"><link rel="prefetch" href="/plana/assets/js/311.7cadacd8.js"><link rel="prefetch" href="/plana/assets/js/312.36004dd0.js"><link rel="prefetch" href="/plana/assets/js/313.efb51116.js"><link rel="prefetch" href="/plana/assets/js/314.55c74d14.js"><link rel="prefetch" href="/plana/assets/js/315.fc4d91f4.js"><link rel="prefetch" href="/plana/assets/js/316.dde0feb1.js"><link rel="prefetch" href="/plana/assets/js/317.ef59c7dd.js"><link rel="prefetch" href="/plana/assets/js/318.9c8514de.js"><link rel="prefetch" href="/plana/assets/js/319.e934bf23.js"><link rel="prefetch" href="/plana/assets/js/32.611da568.js"><link rel="prefetch" href="/plana/assets/js/320.2c3bf800.js"><link rel="prefetch" href="/plana/assets/js/321.2f166a58.js"><link rel="prefetch" href="/plana/assets/js/322.2727112d.js"><link rel="prefetch" href="/plana/assets/js/323.987dae09.js"><link rel="prefetch" href="/plana/assets/js/324.059197e5.js"><link rel="prefetch" href="/plana/assets/js/325.251603a9.js"><link rel="prefetch" href="/plana/assets/js/326.b9aa9786.js"><link rel="prefetch" href="/plana/assets/js/327.83df42f2.js"><link rel="prefetch" href="/plana/assets/js/328.437841b5.js"><link rel="prefetch" href="/plana/assets/js/329.4705178f.js"><link rel="prefetch" href="/plana/assets/js/33.04179be5.js"><link rel="prefetch" href="/plana/assets/js/330.7fefbd39.js"><link rel="prefetch" href="/plana/assets/js/331.324b88a4.js"><link rel="prefetch" href="/plana/assets/js/332.9dbc0a0f.js"><link rel="prefetch" href="/plana/assets/js/333.a9f4ba89.js"><link rel="prefetch" href="/plana/assets/js/334.bfc521ff.js"><link rel="prefetch" href="/plana/assets/js/335.ea772c69.js"><link rel="prefetch" href="/plana/assets/js/336.3c139a73.js"><link rel="prefetch" href="/plana/assets/js/337.4b7b5285.js"><link rel="prefetch" href="/plana/assets/js/338.40b3bfdb.js"><link rel="prefetch" href="/plana/assets/js/339.bf0c2419.js"><link rel="prefetch" href="/plana/assets/js/34.7d7532c6.js"><link rel="prefetch" href="/plana/assets/js/340.9ceb2f7a.js"><link rel="prefetch" href="/plana/assets/js/341.bc48efb9.js"><link rel="prefetch" href="/plana/assets/js/342.75077914.js"><link rel="prefetch" href="/plana/assets/js/343.efda7d56.js"><link rel="prefetch" href="/plana/assets/js/344.31c0f3c6.js"><link rel="prefetch" href="/plana/assets/js/345.7fb06b95.js"><link rel="prefetch" href="/plana/assets/js/346.55ccf355.js"><link rel="prefetch" href="/plana/assets/js/347.98aa9eab.js"><link rel="prefetch" href="/plana/assets/js/348.878dac49.js"><link rel="prefetch" href="/plana/assets/js/349.878acfca.js"><link rel="prefetch" href="/plana/assets/js/35.a56a078a.js"><link rel="prefetch" href="/plana/assets/js/350.67d85dec.js"><link rel="prefetch" href="/plana/assets/js/351.fe864f55.js"><link rel="prefetch" href="/plana/assets/js/352.0140a20d.js"><link rel="prefetch" href="/plana/assets/js/353.1a2bdf26.js"><link rel="prefetch" href="/plana/assets/js/354.e698b263.js"><link rel="prefetch" href="/plana/assets/js/355.69178048.js"><link rel="prefetch" href="/plana/assets/js/356.13571020.js"><link rel="prefetch" href="/plana/assets/js/357.666a6e4e.js"><link rel="prefetch" href="/plana/assets/js/358.3a859aae.js"><link rel="prefetch" href="/plana/assets/js/359.e6291586.js"><link rel="prefetch" href="/plana/assets/js/36.6b2c1c06.js"><link rel="prefetch" href="/plana/assets/js/360.553be648.js"><link rel="prefetch" href="/plana/assets/js/361.f674d762.js"><link rel="prefetch" href="/plana/assets/js/362.41696f0b.js"><link rel="prefetch" href="/plana/assets/js/363.db6b18e5.js"><link rel="prefetch" href="/plana/assets/js/364.f4ef8d66.js"><link rel="prefetch" href="/plana/assets/js/365.060bb2cd.js"><link rel="prefetch" href="/plana/assets/js/366.af8be9cf.js"><link rel="prefetch" href="/plana/assets/js/367.89b9bd1a.js"><link rel="prefetch" href="/plana/assets/js/368.4a0db9f9.js"><link rel="prefetch" href="/plana/assets/js/369.0f137c05.js"><link rel="prefetch" href="/plana/assets/js/37.a372e2ff.js"><link rel="prefetch" href="/plana/assets/js/370.d0503cfb.js"><link rel="prefetch" href="/plana/assets/js/371.a5a61f6c.js"><link rel="prefetch" href="/plana/assets/js/372.a8beeec6.js"><link rel="prefetch" href="/plana/assets/js/373.52486327.js"><link rel="prefetch" href="/plana/assets/js/374.becb79ef.js"><link rel="prefetch" href="/plana/assets/js/375.adbe845a.js"><link rel="prefetch" href="/plana/assets/js/376.0b725de7.js"><link rel="prefetch" href="/plana/assets/js/377.6d0755e8.js"><link rel="prefetch" href="/plana/assets/js/378.9899dca3.js"><link rel="prefetch" href="/plana/assets/js/379.8567246b.js"><link rel="prefetch" href="/plana/assets/js/38.bf139dae.js"><link rel="prefetch" href="/plana/assets/js/380.fff3aeb0.js"><link rel="prefetch" href="/plana/assets/js/381.5d8ddb4d.js"><link rel="prefetch" href="/plana/assets/js/382.ebb79c48.js"><link rel="prefetch" href="/plana/assets/js/383.b1d8b5be.js"><link rel="prefetch" href="/plana/assets/js/384.b8ef0439.js"><link rel="prefetch" href="/plana/assets/js/385.274ad089.js"><link rel="prefetch" href="/plana/assets/js/386.8dc07401.js"><link rel="prefetch" href="/plana/assets/js/387.aea18e98.js"><link rel="prefetch" href="/plana/assets/js/388.1ef06a0b.js"><link rel="prefetch" href="/plana/assets/js/389.9d65f18d.js"><link rel="prefetch" href="/plana/assets/js/39.5a4f8e59.js"><link rel="prefetch" href="/plana/assets/js/390.6bd12dc7.js"><link rel="prefetch" href="/plana/assets/js/391.6ef66911.js"><link rel="prefetch" href="/plana/assets/js/392.ffba56bb.js"><link rel="prefetch" href="/plana/assets/js/393.a5fc8fba.js"><link rel="prefetch" href="/plana/assets/js/394.6ab7521b.js"><link rel="prefetch" href="/plana/assets/js/395.3ab7f171.js"><link rel="prefetch" href="/plana/assets/js/396.0791500c.js"><link rel="prefetch" href="/plana/assets/js/397.28bf46c8.js"><link rel="prefetch" href="/plana/assets/js/398.7807db8d.js"><link rel="prefetch" href="/plana/assets/js/399.4d403b1b.js"><link rel="prefetch" href="/plana/assets/js/4.6af04a85.js"><link rel="prefetch" href="/plana/assets/js/40.43e4b38f.js"><link rel="prefetch" href="/plana/assets/js/400.c888a05f.js"><link rel="prefetch" href="/plana/assets/js/401.6dfdc401.js"><link rel="prefetch" href="/plana/assets/js/402.2836e580.js"><link rel="prefetch" href="/plana/assets/js/403.a8ec3c75.js"><link rel="prefetch" href="/plana/assets/js/404.5858ee05.js"><link rel="prefetch" href="/plana/assets/js/405.4fd5cbce.js"><link rel="prefetch" href="/plana/assets/js/406.059c34fc.js"><link rel="prefetch" href="/plana/assets/js/407.1991324f.js"><link rel="prefetch" href="/plana/assets/js/408.57f13ab2.js"><link rel="prefetch" href="/plana/assets/js/409.b3fdbf19.js"><link rel="prefetch" href="/plana/assets/js/41.baf41ad2.js"><link rel="prefetch" href="/plana/assets/js/410.1c66b59b.js"><link rel="prefetch" href="/plana/assets/js/411.89daa103.js"><link rel="prefetch" href="/plana/assets/js/412.5fd17d05.js"><link rel="prefetch" href="/plana/assets/js/413.67df2b20.js"><link rel="prefetch" href="/plana/assets/js/414.7c1feaab.js"><link rel="prefetch" href="/plana/assets/js/415.e07db45d.js"><link rel="prefetch" href="/plana/assets/js/416.fe7e2c62.js"><link rel="prefetch" href="/plana/assets/js/417.c9f94e9c.js"><link rel="prefetch" href="/plana/assets/js/418.18704cfc.js"><link rel="prefetch" href="/plana/assets/js/419.9f113e64.js"><link rel="prefetch" href="/plana/assets/js/42.f2884796.js"><link rel="prefetch" href="/plana/assets/js/420.2a5f3a3f.js"><link rel="prefetch" href="/plana/assets/js/421.1b110d49.js"><link rel="prefetch" href="/plana/assets/js/422.b836f5a4.js"><link rel="prefetch" href="/plana/assets/js/423.9fa437af.js"><link rel="prefetch" href="/plana/assets/js/424.0fc0a623.js"><link rel="prefetch" href="/plana/assets/js/425.4bee6afc.js"><link rel="prefetch" href="/plana/assets/js/426.036d5a1b.js"><link rel="prefetch" href="/plana/assets/js/427.f2a1aa48.js"><link rel="prefetch" href="/plana/assets/js/428.fc22796c.js"><link rel="prefetch" href="/plana/assets/js/429.b6acfba5.js"><link rel="prefetch" href="/plana/assets/js/43.7aa39e52.js"><link rel="prefetch" href="/plana/assets/js/430.ed97aa43.js"><link rel="prefetch" href="/plana/assets/js/431.2fc0d4e3.js"><link rel="prefetch" href="/plana/assets/js/432.43115b63.js"><link rel="prefetch" href="/plana/assets/js/433.a1c3b83a.js"><link rel="prefetch" href="/plana/assets/js/434.ee152248.js"><link rel="prefetch" href="/plana/assets/js/435.24976c8a.js"><link rel="prefetch" href="/plana/assets/js/436.59dd1ab1.js"><link rel="prefetch" href="/plana/assets/js/437.50136991.js"><link rel="prefetch" href="/plana/assets/js/438.5eb6bf82.js"><link rel="prefetch" href="/plana/assets/js/439.9e310ae5.js"><link rel="prefetch" href="/plana/assets/js/44.ea8da77b.js"><link rel="prefetch" href="/plana/assets/js/440.2457f927.js"><link rel="prefetch" href="/plana/assets/js/441.fbc13ad6.js"><link rel="prefetch" href="/plana/assets/js/442.d130c4b3.js"><link rel="prefetch" href="/plana/assets/js/443.1f900823.js"><link rel="prefetch" href="/plana/assets/js/444.3834d598.js"><link rel="prefetch" href="/plana/assets/js/445.16932093.js"><link rel="prefetch" href="/plana/assets/js/446.24711545.js"><link rel="prefetch" href="/plana/assets/js/447.568b3f96.js"><link rel="prefetch" href="/plana/assets/js/448.8883fa0d.js"><link rel="prefetch" href="/plana/assets/js/449.f6184633.js"><link rel="prefetch" href="/plana/assets/js/45.73a9f625.js"><link rel="prefetch" href="/plana/assets/js/450.a996511c.js"><link rel="prefetch" href="/plana/assets/js/451.1b1843f7.js"><link rel="prefetch" href="/plana/assets/js/452.0be6db8b.js"><link rel="prefetch" href="/plana/assets/js/453.2c9eca27.js"><link rel="prefetch" href="/plana/assets/js/454.43d6b922.js"><link rel="prefetch" href="/plana/assets/js/455.798dc8d2.js"><link rel="prefetch" href="/plana/assets/js/456.5294aa61.js"><link rel="prefetch" href="/plana/assets/js/457.582336be.js"><link rel="prefetch" href="/plana/assets/js/458.3ae86239.js"><link rel="prefetch" href="/plana/assets/js/459.17fe935e.js"><link rel="prefetch" href="/plana/assets/js/46.6c8e3280.js"><link rel="prefetch" href="/plana/assets/js/460.e3ca3d89.js"><link rel="prefetch" href="/plana/assets/js/461.9f892ebc.js"><link rel="prefetch" href="/plana/assets/js/462.57d0ad29.js"><link rel="prefetch" href="/plana/assets/js/463.a1965841.js"><link rel="prefetch" href="/plana/assets/js/464.d0da0b56.js"><link rel="prefetch" href="/plana/assets/js/465.6cb0dd50.js"><link rel="prefetch" href="/plana/assets/js/466.272ea41f.js"><link rel="prefetch" href="/plana/assets/js/467.9c04d6bf.js"><link rel="prefetch" href="/plana/assets/js/468.b91655c9.js"><link rel="prefetch" href="/plana/assets/js/469.e4727b4f.js"><link rel="prefetch" href="/plana/assets/js/47.3909e74a.js"><link rel="prefetch" href="/plana/assets/js/470.b11beb41.js"><link rel="prefetch" href="/plana/assets/js/471.4753cb89.js"><link rel="prefetch" href="/plana/assets/js/472.29077ff8.js"><link rel="prefetch" href="/plana/assets/js/473.a653331c.js"><link rel="prefetch" href="/plana/assets/js/474.2a8fae88.js"><link rel="prefetch" href="/plana/assets/js/475.9b78390f.js"><link rel="prefetch" href="/plana/assets/js/476.9e13c339.js"><link rel="prefetch" href="/plana/assets/js/477.05a2179e.js"><link rel="prefetch" href="/plana/assets/js/478.9c4f06c9.js"><link rel="prefetch" href="/plana/assets/js/479.559e2b93.js"><link rel="prefetch" href="/plana/assets/js/48.be057863.js"><link rel="prefetch" href="/plana/assets/js/480.ec41e7ce.js"><link rel="prefetch" href="/plana/assets/js/481.113c6aa3.js"><link rel="prefetch" href="/plana/assets/js/482.40e20309.js"><link rel="prefetch" href="/plana/assets/js/483.689e3d97.js"><link rel="prefetch" href="/plana/assets/js/484.069ebf35.js"><link rel="prefetch" href="/plana/assets/js/485.9e7bd20f.js"><link rel="prefetch" href="/plana/assets/js/486.c163809d.js"><link rel="prefetch" href="/plana/assets/js/487.acdd4863.js"><link rel="prefetch" href="/plana/assets/js/488.6075f8e7.js"><link rel="prefetch" href="/plana/assets/js/489.77207a01.js"><link rel="prefetch" href="/plana/assets/js/49.64cd900d.js"><link rel="prefetch" href="/plana/assets/js/490.2bb176f4.js"><link rel="prefetch" href="/plana/assets/js/491.07e739a2.js"><link rel="prefetch" href="/plana/assets/js/492.e07a5eee.js"><link rel="prefetch" href="/plana/assets/js/493.333ffb97.js"><link rel="prefetch" href="/plana/assets/js/494.ef208677.js"><link rel="prefetch" href="/plana/assets/js/495.a1f2d8cb.js"><link rel="prefetch" href="/plana/assets/js/496.6f6a823a.js"><link rel="prefetch" href="/plana/assets/js/497.c44b60d1.js"><link rel="prefetch" href="/plana/assets/js/498.2b898143.js"><link rel="prefetch" href="/plana/assets/js/499.366c11df.js"><link rel="prefetch" href="/plana/assets/js/5.6d71262c.js"><link rel="prefetch" href="/plana/assets/js/50.b2d0e32a.js"><link rel="prefetch" href="/plana/assets/js/500.c2769d0d.js"><link rel="prefetch" href="/plana/assets/js/501.5db31a91.js"><link rel="prefetch" href="/plana/assets/js/502.6550f71c.js"><link rel="prefetch" href="/plana/assets/js/503.bcac8e8e.js"><link rel="prefetch" href="/plana/assets/js/504.defc6a0c.js"><link rel="prefetch" href="/plana/assets/js/505.6db6e3e2.js"><link rel="prefetch" href="/plana/assets/js/506.1be6db54.js"><link rel="prefetch" href="/plana/assets/js/507.e3063e28.js"><link rel="prefetch" href="/plana/assets/js/508.9fcc5bc1.js"><link rel="prefetch" href="/plana/assets/js/509.69b407c9.js"><link rel="prefetch" href="/plana/assets/js/51.98c6fcd6.js"><link rel="prefetch" href="/plana/assets/js/510.78cc9b58.js"><link rel="prefetch" href="/plana/assets/js/511.890e750c.js"><link rel="prefetch" href="/plana/assets/js/512.54f5237b.js"><link rel="prefetch" href="/plana/assets/js/513.71e81daf.js"><link rel="prefetch" href="/plana/assets/js/514.43eff2c4.js"><link rel="prefetch" href="/plana/assets/js/515.267a0ebd.js"><link rel="prefetch" href="/plana/assets/js/516.619a751e.js"><link rel="prefetch" href="/plana/assets/js/517.7e7b4f57.js"><link rel="prefetch" href="/plana/assets/js/518.4b5b069f.js"><link rel="prefetch" href="/plana/assets/js/519.cecd2dba.js"><link rel="prefetch" href="/plana/assets/js/52.51175da9.js"><link rel="prefetch" href="/plana/assets/js/520.d61eaea1.js"><link rel="prefetch" href="/plana/assets/js/521.1bdd256d.js"><link rel="prefetch" href="/plana/assets/js/522.9eb89cb1.js"><link rel="prefetch" href="/plana/assets/js/523.c21b0f67.js"><link rel="prefetch" href="/plana/assets/js/524.e8e2b891.js"><link rel="prefetch" href="/plana/assets/js/525.5d527982.js"><link rel="prefetch" href="/plana/assets/js/526.06ac5112.js"><link rel="prefetch" href="/plana/assets/js/527.9fb3036e.js"><link rel="prefetch" href="/plana/assets/js/528.fc9e2c1b.js"><link rel="prefetch" href="/plana/assets/js/529.9334c6ad.js"><link rel="prefetch" href="/plana/assets/js/53.4db53b65.js"><link rel="prefetch" href="/plana/assets/js/530.d069e448.js"><link rel="prefetch" href="/plana/assets/js/531.6b5d9a6c.js"><link rel="prefetch" href="/plana/assets/js/532.b288face.js"><link rel="prefetch" href="/plana/assets/js/533.dd36700a.js"><link rel="prefetch" href="/plana/assets/js/534.430379e3.js"><link rel="prefetch" href="/plana/assets/js/535.5b1ec919.js"><link rel="prefetch" href="/plana/assets/js/536.62d48a69.js"><link rel="prefetch" href="/plana/assets/js/537.e4ba4cc0.js"><link rel="prefetch" href="/plana/assets/js/538.2ba0b7b5.js"><link rel="prefetch" href="/plana/assets/js/539.44d94e0a.js"><link rel="prefetch" href="/plana/assets/js/54.4ecc183c.js"><link rel="prefetch" href="/plana/assets/js/540.58126542.js"><link rel="prefetch" href="/plana/assets/js/541.8a2719d4.js"><link rel="prefetch" href="/plana/assets/js/542.63823f7d.js"><link rel="prefetch" href="/plana/assets/js/543.fd601531.js"><link rel="prefetch" href="/plana/assets/js/544.c2d41a95.js"><link rel="prefetch" href="/plana/assets/js/545.c0f15057.js"><link rel="prefetch" href="/plana/assets/js/546.752d4411.js"><link rel="prefetch" href="/plana/assets/js/547.05b54675.js"><link rel="prefetch" href="/plana/assets/js/548.9c781add.js"><link rel="prefetch" href="/plana/assets/js/549.f1400ef4.js"><link rel="prefetch" href="/plana/assets/js/55.eea26142.js"><link rel="prefetch" href="/plana/assets/js/550.1c4c183f.js"><link rel="prefetch" href="/plana/assets/js/551.a6ea4558.js"><link rel="prefetch" href="/plana/assets/js/552.0d04b29e.js"><link rel="prefetch" href="/plana/assets/js/553.5c2ddf4f.js"><link rel="prefetch" href="/plana/assets/js/554.0a16293a.js"><link rel="prefetch" href="/plana/assets/js/555.015fced4.js"><link rel="prefetch" href="/plana/assets/js/556.6a698949.js"><link rel="prefetch" href="/plana/assets/js/557.fee4398a.js"><link rel="prefetch" href="/plana/assets/js/558.20023b16.js"><link rel="prefetch" href="/plana/assets/js/559.fd760ca6.js"><link rel="prefetch" href="/plana/assets/js/56.8bddb4ea.js"><link rel="prefetch" href="/plana/assets/js/560.27c09de9.js"><link rel="prefetch" href="/plana/assets/js/561.1b28b647.js"><link rel="prefetch" href="/plana/assets/js/562.de1b62da.js"><link rel="prefetch" href="/plana/assets/js/563.3e063e33.js"><link rel="prefetch" href="/plana/assets/js/564.fbdb4383.js"><link rel="prefetch" href="/plana/assets/js/565.6ac66720.js"><link rel="prefetch" href="/plana/assets/js/566.00ccbe3d.js"><link rel="prefetch" href="/plana/assets/js/567.822ff786.js"><link rel="prefetch" href="/plana/assets/js/568.2ebcf522.js"><link rel="prefetch" href="/plana/assets/js/569.ee2e3485.js"><link rel="prefetch" href="/plana/assets/js/57.ff655a80.js"><link rel="prefetch" href="/plana/assets/js/570.a9314e9d.js"><link rel="prefetch" href="/plana/assets/js/571.af242a14.js"><link rel="prefetch" href="/plana/assets/js/572.dff86d44.js"><link rel="prefetch" href="/plana/assets/js/573.060ed316.js"><link rel="prefetch" href="/plana/assets/js/574.ecea29a4.js"><link rel="prefetch" href="/plana/assets/js/575.a526b6e0.js"><link rel="prefetch" href="/plana/assets/js/576.1a856efd.js"><link rel="prefetch" href="/plana/assets/js/577.340a24d3.js"><link rel="prefetch" href="/plana/assets/js/578.1e87e5de.js"><link rel="prefetch" href="/plana/assets/js/579.ba400d0d.js"><link rel="prefetch" href="/plana/assets/js/58.6d7395ff.js"><link rel="prefetch" href="/plana/assets/js/580.8470a6ab.js"><link rel="prefetch" href="/plana/assets/js/581.24b8fa46.js"><link rel="prefetch" href="/plana/assets/js/582.11991e75.js"><link rel="prefetch" href="/plana/assets/js/583.1af0e850.js"><link rel="prefetch" href="/plana/assets/js/584.b671635d.js"><link rel="prefetch" href="/plana/assets/js/585.5ec10dae.js"><link rel="prefetch" href="/plana/assets/js/586.cf868939.js"><link rel="prefetch" href="/plana/assets/js/587.e937242b.js"><link rel="prefetch" href="/plana/assets/js/588.9993b844.js"><link rel="prefetch" href="/plana/assets/js/589.040b58f8.js"><link rel="prefetch" href="/plana/assets/js/59.d91c7a50.js"><link rel="prefetch" href="/plana/assets/js/590.7f347f61.js"><link rel="prefetch" href="/plana/assets/js/591.3acb8a8d.js"><link rel="prefetch" href="/plana/assets/js/592.c0fecc8a.js"><link rel="prefetch" href="/plana/assets/js/593.0ee76323.js"><link rel="prefetch" href="/plana/assets/js/594.7e15bb85.js"><link rel="prefetch" href="/plana/assets/js/595.b5540278.js"><link rel="prefetch" href="/plana/assets/js/596.2996c0fa.js"><link rel="prefetch" href="/plana/assets/js/597.3a3b9a07.js"><link rel="prefetch" href="/plana/assets/js/598.510c6ec5.js"><link rel="prefetch" href="/plana/assets/js/599.f7cd0ab9.js"><link rel="prefetch" href="/plana/assets/js/6.23e42cf9.js"><link rel="prefetch" href="/plana/assets/js/60.12c2a97e.js"><link rel="prefetch" href="/plana/assets/js/600.3a511d88.js"><link rel="prefetch" href="/plana/assets/js/601.1620fe4a.js"><link rel="prefetch" href="/plana/assets/js/602.92820a4e.js"><link rel="prefetch" href="/plana/assets/js/603.fa3b8f68.js"><link rel="prefetch" href="/plana/assets/js/604.a75f5d11.js"><link rel="prefetch" href="/plana/assets/js/605.6e16e44e.js"><link rel="prefetch" href="/plana/assets/js/606.3ca54f7c.js"><link rel="prefetch" href="/plana/assets/js/607.ed2521fd.js"><link rel="prefetch" href="/plana/assets/js/608.83c6a7b7.js"><link rel="prefetch" href="/plana/assets/js/609.cc5d05f6.js"><link rel="prefetch" href="/plana/assets/js/61.57554021.js"><link rel="prefetch" href="/plana/assets/js/610.e114869f.js"><link rel="prefetch" href="/plana/assets/js/611.4dfe17f1.js"><link rel="prefetch" href="/plana/assets/js/612.e9e7cdd9.js"><link rel="prefetch" href="/plana/assets/js/613.52fab004.js"><link rel="prefetch" href="/plana/assets/js/614.03e68635.js"><link rel="prefetch" href="/plana/assets/js/615.b5b202c3.js"><link rel="prefetch" href="/plana/assets/js/616.55d3ec0f.js"><link rel="prefetch" href="/plana/assets/js/617.caa80506.js"><link rel="prefetch" href="/plana/assets/js/618.97c71cdd.js"><link rel="prefetch" href="/plana/assets/js/619.506d3336.js"><link rel="prefetch" href="/plana/assets/js/62.c471c2b6.js"><link rel="prefetch" href="/plana/assets/js/620.d265d33b.js"><link rel="prefetch" href="/plana/assets/js/621.c7274a04.js"><link rel="prefetch" href="/plana/assets/js/622.78f88193.js"><link rel="prefetch" href="/plana/assets/js/623.460ecfe4.js"><link rel="prefetch" href="/plana/assets/js/624.af5db8f4.js"><link rel="prefetch" href="/plana/assets/js/625.b8b56400.js"><link rel="prefetch" href="/plana/assets/js/626.5f935139.js"><link rel="prefetch" href="/plana/assets/js/627.5eae5139.js"><link rel="prefetch" href="/plana/assets/js/628.b76c4230.js"><link rel="prefetch" href="/plana/assets/js/629.b5df5447.js"><link rel="prefetch" href="/plana/assets/js/63.a859b22b.js"><link rel="prefetch" href="/plana/assets/js/630.b4353e1e.js"><link rel="prefetch" href="/plana/assets/js/631.f52d250f.js"><link rel="prefetch" href="/plana/assets/js/632.fb3cd435.js"><link rel="prefetch" href="/plana/assets/js/633.d11743c5.js"><link rel="prefetch" href="/plana/assets/js/634.f274f0f2.js"><link rel="prefetch" href="/plana/assets/js/635.e4b93eee.js"><link rel="prefetch" href="/plana/assets/js/636.ddfe36dc.js"><link rel="prefetch" href="/plana/assets/js/637.773dfbf9.js"><link rel="prefetch" href="/plana/assets/js/638.5d3283ef.js"><link rel="prefetch" href="/plana/assets/js/639.1182aa0e.js"><link rel="prefetch" href="/plana/assets/js/64.3933d035.js"><link rel="prefetch" href="/plana/assets/js/640.fc30215e.js"><link rel="prefetch" href="/plana/assets/js/641.8fa04f8c.js"><link rel="prefetch" href="/plana/assets/js/642.9adc9013.js"><link rel="prefetch" href="/plana/assets/js/643.c553c77d.js"><link rel="prefetch" href="/plana/assets/js/644.f45f12bc.js"><link rel="prefetch" href="/plana/assets/js/645.45551213.js"><link rel="prefetch" href="/plana/assets/js/646.20f8455d.js"><link rel="prefetch" href="/plana/assets/js/647.f83d8512.js"><link rel="prefetch" href="/plana/assets/js/648.d2116c6d.js"><link rel="prefetch" href="/plana/assets/js/649.7c63bf5a.js"><link rel="prefetch" href="/plana/assets/js/65.c73421f0.js"><link rel="prefetch" href="/plana/assets/js/650.a8d4d68c.js"><link rel="prefetch" href="/plana/assets/js/651.660dc950.js"><link rel="prefetch" href="/plana/assets/js/652.e4a8d299.js"><link rel="prefetch" href="/plana/assets/js/653.d5cb1829.js"><link rel="prefetch" href="/plana/assets/js/654.06347c17.js"><link rel="prefetch" href="/plana/assets/js/655.1407708a.js"><link rel="prefetch" href="/plana/assets/js/656.c8c6bc8b.js"><link rel="prefetch" href="/plana/assets/js/657.5bfffe54.js"><link rel="prefetch" href="/plana/assets/js/658.548e92c7.js"><link rel="prefetch" href="/plana/assets/js/659.e6f86d89.js"><link rel="prefetch" href="/plana/assets/js/66.db88a898.js"><link rel="prefetch" href="/plana/assets/js/660.68b4f9c1.js"><link rel="prefetch" href="/plana/assets/js/661.7c1843eb.js"><link rel="prefetch" href="/plana/assets/js/662.fd5c9c14.js"><link rel="prefetch" href="/plana/assets/js/663.2a29079b.js"><link rel="prefetch" href="/plana/assets/js/664.f7e273fb.js"><link rel="prefetch" href="/plana/assets/js/665.92739f4f.js"><link rel="prefetch" href="/plana/assets/js/666.c9dfc4da.js"><link rel="prefetch" href="/plana/assets/js/667.e4e37653.js"><link rel="prefetch" href="/plana/assets/js/668.753f6377.js"><link rel="prefetch" href="/plana/assets/js/669.26bfae22.js"><link rel="prefetch" href="/plana/assets/js/67.ad91902f.js"><link rel="prefetch" href="/plana/assets/js/670.a70329fc.js"><link rel="prefetch" href="/plana/assets/js/671.11637c8c.js"><link rel="prefetch" href="/plana/assets/js/672.9a3410bf.js"><link rel="prefetch" href="/plana/assets/js/673.5f4041b7.js"><link rel="prefetch" href="/plana/assets/js/674.7a725878.js"><link rel="prefetch" href="/plana/assets/js/675.d55427e9.js"><link rel="prefetch" href="/plana/assets/js/676.eb15c05a.js"><link rel="prefetch" href="/plana/assets/js/677.98c18ede.js"><link rel="prefetch" href="/plana/assets/js/678.db86b061.js"><link rel="prefetch" href="/plana/assets/js/679.972243d8.js"><link rel="prefetch" href="/plana/assets/js/68.3e6dcf8f.js"><link rel="prefetch" href="/plana/assets/js/680.d9e2eba1.js"><link rel="prefetch" href="/plana/assets/js/681.8e0783ae.js"><link rel="prefetch" href="/plana/assets/js/682.a0c2e943.js"><link rel="prefetch" href="/plana/assets/js/683.d9a0e0b6.js"><link rel="prefetch" href="/plana/assets/js/684.19b16b09.js"><link rel="prefetch" href="/plana/assets/js/685.1dfde878.js"><link rel="prefetch" href="/plana/assets/js/686.5ebd864b.js"><link rel="prefetch" href="/plana/assets/js/687.9d3c3ee0.js"><link rel="prefetch" href="/plana/assets/js/688.7a8d52a4.js"><link rel="prefetch" href="/plana/assets/js/689.43733f87.js"><link rel="prefetch" href="/plana/assets/js/69.0c93e68b.js"><link rel="prefetch" href="/plana/assets/js/690.b3cc0545.js"><link rel="prefetch" href="/plana/assets/js/691.f0c9f432.js"><link rel="prefetch" href="/plana/assets/js/692.fe5d277f.js"><link rel="prefetch" href="/plana/assets/js/693.f2a5bc91.js"><link rel="prefetch" href="/plana/assets/js/694.0afc8ee3.js"><link rel="prefetch" href="/plana/assets/js/695.02d143c2.js"><link rel="prefetch" href="/plana/assets/js/696.fc35e844.js"><link rel="prefetch" href="/plana/assets/js/697.59baff52.js"><link rel="prefetch" href="/plana/assets/js/698.32395aca.js"><link rel="prefetch" href="/plana/assets/js/699.49a455e0.js"><link rel="prefetch" href="/plana/assets/js/7.4d84b003.js"><link rel="prefetch" href="/plana/assets/js/70.02b035df.js"><link rel="prefetch" href="/plana/assets/js/71.50c27702.js"><link rel="prefetch" href="/plana/assets/js/72.d0b51e9d.js"><link rel="prefetch" href="/plana/assets/js/73.88fbc437.js"><link rel="prefetch" href="/plana/assets/js/74.4323b154.js"><link rel="prefetch" href="/plana/assets/js/75.c07fede3.js"><link rel="prefetch" href="/plana/assets/js/76.d17b982e.js"><link rel="prefetch" href="/plana/assets/js/77.2c2c823d.js"><link rel="prefetch" href="/plana/assets/js/78.6339cdb8.js"><link rel="prefetch" href="/plana/assets/js/79.08610500.js"><link rel="prefetch" href="/plana/assets/js/8.28fd7fea.js"><link rel="prefetch" href="/plana/assets/js/80.fd045bb2.js"><link rel="prefetch" href="/plana/assets/js/82.f186782c.js"><link rel="prefetch" href="/plana/assets/js/83.5b829c7f.js"><link rel="prefetch" href="/plana/assets/js/84.0edd8a25.js"><link rel="prefetch" href="/plana/assets/js/85.cb1c8ff9.js"><link rel="prefetch" href="/plana/assets/js/86.6e0b2f9b.js"><link rel="prefetch" href="/plana/assets/js/87.36b6b2f5.js"><link rel="prefetch" href="/plana/assets/js/88.a23a2afa.js"><link rel="prefetch" href="/plana/assets/js/89.765b2b9d.js"><link rel="prefetch" href="/plana/assets/js/9.59274a6f.js"><link rel="prefetch" href="/plana/assets/js/90.a62aad9b.js"><link rel="prefetch" href="/plana/assets/js/91.96d9b5fa.js"><link rel="prefetch" href="/plana/assets/js/92.b7f7e048.js"><link rel="prefetch" href="/plana/assets/js/93.c7a06bfe.js"><link rel="prefetch" href="/plana/assets/js/94.097b631a.js"><link rel="prefetch" href="/plana/assets/js/95.cdb222d4.js"><link rel="prefetch" href="/plana/assets/js/96.5a864796.js"><link rel="prefetch" href="/plana/assets/js/97.7478b98b.js"><link rel="prefetch" href="/plana/assets/js/98.c9fff4ca.js"><link rel="prefetch" href="/plana/assets/js/99.1e106589.js">
    <link rel="stylesheet" href="/plana/assets/css/0.styles.e9cba6b3.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/plana/" class="home-link router-link-active"><!----> <span class="site-name">Plana(方案A)</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Service Java(者)" class="dropdown-title"><span class="title">Service Java(者)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch1-core-oop/" class="nav-link">
  Core Oop
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch2-utils-crud/" class="nav-link">
  Utils Crud
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch3-web-springboot/" class="nav-link router-link-active">
  Web Springboot
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch4-micro-cloud/" class="nav-link">
  Micro Cloud
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch5-devops-native/" class="nav-link">
  Devops Native
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch6-platform-faas/" class="nav-link">
  Platform Faas
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch7-perf-jvm/" class="nav-link">
  Perf Jvm
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch8-arch-pmp/" class="nav-link">
  Arch Pmp
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Ui Javascript(皆)" class="dropdown-title"><span class="title">Ui Javascript(皆)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch1-core-prototype/" class="nav-link">
  Core Prototype
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch2-web3-html5/" class="nav-link">
  Web3 Html5
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch3-component-mvc/" class="nav-link">
  Component Mvc
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch4-service-nodejs/" class="nav-link">
  Service Nodejs
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch5-devops-scaffold/" class="nav-link">
  Devops Scaffold
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch6-hybrid-webapp/" class="nav-link">
  Hybrid Webapp
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch7-visualizing-chart/" class="nav-link">
  Visualizing Chart
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch8-interaction-gl/" class="nav-link">
  Interaction Gl
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Data Python(数)" class="dropdown-title"><span class="title">Data Python(数)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch1-core-pymath/" class="nav-link">
  Core Pymath
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch2-utils-dataset/" class="nav-link">
  Utils Dataset
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch3-service-flask/" class="nav-link">
  Service Flask
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch4-bigdata-analysis/" class="nav-link">
  Bigdata Analysis
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch5-devops-auto/" class="nav-link">
  Devops Auto
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch6-ai-machine/" class="nav-link">
  Ai Machine
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch7-visualizing-gui/" class="nav-link">
  Visualizing Gui
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch8-control-embed/" class="nav-link">
  Control Embed
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="关于" class="dropdown-title"><span class="title">关于</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/luo0412" target="_blank" rel="noopener noreferrer" class="nav-link external">
  Github
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li><li class="dropdown-item"><!----> <a href="/plana/about-me.html" class="nav-link">
  关于我
</a></li><li class="dropdown-item"><!----> <a href="/plana/md-style.html" class="nav-link">
  笔记风格
</a></li><li class="dropdown-item"><!----> <a href="/plana/related-links.html" class="nav-link">
  友情链接
</a></li></ul></div></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Service Java(者)" class="dropdown-title"><span class="title">Service Java(者)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch1-core-oop/" class="nav-link">
  Core Oop
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch2-utils-crud/" class="nav-link">
  Utils Crud
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch3-web-springboot/" class="nav-link router-link-active">
  Web Springboot
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch4-micro-cloud/" class="nav-link">
  Micro Cloud
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch5-devops-native/" class="nav-link">
  Devops Native
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch6-platform-faas/" class="nav-link">
  Platform Faas
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch7-perf-jvm/" class="nav-link">
  Perf Jvm
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch8-arch-pmp/" class="nav-link">
  Arch Pmp
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.3.service-java/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Ui Javascript(皆)" class="dropdown-title"><span class="title">Ui Javascript(皆)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch1-core-prototype/" class="nav-link">
  Core Prototype
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch2-web3-html5/" class="nav-link">
  Web3 Html5
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch3-component-mvc/" class="nav-link">
  Component Mvc
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch4-service-nodejs/" class="nav-link">
  Service Nodejs
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch5-devops-scaffold/" class="nav-link">
  Devops Scaffold
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch6-hybrid-webapp/" class="nav-link">
  Hybrid Webapp
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch7-visualizing-chart/" class="nav-link">
  Visualizing Chart
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch8-interaction-gl/" class="nav-link">
  Interaction Gl
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.4.ui-javascript/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="Data Python(数)" class="dropdown-title"><span class="title">Data Python(数)</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch1-core-pymath/" class="nav-link">
  Core Pymath
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch2-utils-dataset/" class="nav-link">
  Utils Dataset
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch3-service-flask/" class="nav-link">
  Service Flask
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch4-bigdata-analysis/" class="nav-link">
  Bigdata Analysis
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch5-devops-auto/" class="nav-link">
  Devops Auto
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch6-ai-machine/" class="nav-link">
  Ai Machine
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch7-visualizing-gui/" class="nav-link">
  Visualizing Gui
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch8-control-embed/" class="nav-link">
  Control Embed
</a></li><li class="dropdown-item"><!----> <a href="/plana/nav.5.data-python/ch9-code-interview/" class="nav-link">
  Code Interview
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="关于" class="dropdown-title"><span class="title">关于</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="https://github.com/luo0412" target="_blank" rel="noopener noreferrer" class="nav-link external">
  Github
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li><li class="dropdown-item"><!----> <a href="/plana/about-me.html" class="nav-link">
  关于我
</a></li><li class="dropdown-item"><!----> <a href="/plana/md-style.html" class="nav-link">
  笔记风格
</a></li><li class="dropdown-item"><!----> <a href="/plana/related-links.html" class="nav-link">
  友情链接
</a></li></ul></div></div> <!----></nav>  <ul class="sidebar-links"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/" aria-current="page" class="sidebar-link">README</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/01--ji-chu-javaweb-jsp-servlet.html" aria-current="page" class="active sidebar-link">[基础]JavaWeb(Servlet+JSP)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/02-note--shen-ru-fen-xijavaweb-ji-shu-nei-mu-201408.html" class="sidebar-link">[Note]深入分析Java Web技术内幕</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/03--fang-an-ssh--ji-shu-zhan-struct2-old.html" class="sidebar-link">[方案]传统技术栈(SSH)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/04--fang-an-ssm--ji-shu-zhan-springmvc.html" class="sidebar-link">[方案]经典技术栈(SSM)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/05--si-kao--qian-hou-duan-fen-chi-restful.html" class="sidebar-link">[思考]前后端分离(RESTFul)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/06--ji-chu--gong-cheng-jie-gou-pojo-module.html" class="sidebar-link">[基础]工程结构(POJO+Module)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/07--gui-fan--dan-ti-gong-cheng--zui-jia-shi-jian-mono.html" class="sidebar-link">[🈲]单体工程-最佳实践(Mono)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/08--ti-gang-spring--tong-yong-mo-ban-jpa.html" class="sidebar-link">[提纲]Spring-通用模板(JPA)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/09--ti-gang-spring--tong-yong-mo-ban-mybatis.html" class="sidebar-link">[提纲]Spring-通用模板(MyBatis)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/10--sheng-tai--qi-ye-ban-gong-oa-erp.html" class="sidebar-link">[生态]企业办公(OA+ERP)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/11--sheng-tai--bo-ke-lun-tan-cms-blog.html" class="sidebar-link">[生态]博客论坛(CMS+Blog)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/12--sheng-tai--shang-cheng-zhi-fu-mall-pay.html" class="sidebar-link">[生态]商城支付(Mall+Pay)</a></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Frame</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Minor</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/frame/minor/01--ji-chu-act-framework--quservlet.html" class="sidebar-link">[基础]ActFramework(去Servlet)</a></li></ul></section></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/frame/01--ti-gang--chang-yongweb-kuang-jia-restful.html" class="sidebar-link">[提纲]常用Web框架(RESTFul)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/frame/02--ji-chu-play.html" class="sidebar-link">[基础]Play</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/frame/04--ji-chu-jfinal.html" class="sidebar-link">[基础]jfinal</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Solution</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Case</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/case/01--wen-jian-chu-li--shang-chuan-xia-zai-cun-chu.html" class="sidebar-link">文件处理(上传+下载+存储)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/case/02--tu-pian-chu-li--ya-suo-you-hua.html" class="sidebar-link">图片处理(压缩+优化)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/case/03--ye-mian-jing-tai-hua--shang-pin-xiang-qing-ye.html" class="sidebar-link">页面静态化(商品详情页)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/case/04--biao-dan-can-shu-xiao-yan-validator.html" class="sidebar-link">表单参数校验(Validator)</a></li></ul></section></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/01--dao-hang--fu-wu-duan--chang-jian-tong-yong-ye-wu.html" class="sidebar-link">[导航]服务端-常见通用业务</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/03--ti-gang--fu-wu-duan--wei-xin-ping-tai-ye-wu-wechat.html" class="sidebar-link">[提纲]服务端-微信平台业务(Wechat)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/solution/04--fang-an--qing-dai-ma--kuai-su-kai-fa-drools.html" class="sidebar-link">[方案]轻代码-快速开发(drools)</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Spring</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Cmpt</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/cmpt/01--ji-chu-spring-mvc.html" class="sidebar-link">[基础]Spring MVC</a></li></ul></section></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/01--ji-chu-spring.html" class="sidebar-link">[基础]Spring</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/02--ti-gang-spring-quan-jia-tong.html" class="sidebar-link">[提纲]Spring全家桶</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/03--he-xin-spring-he-xin-ioc-di-aop.html" class="sidebar-link">[核心]Spring核心(IoC+DI+AOP)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/04-note-spring-shi-zhan-202002-v5.html" class="sidebar-link">[Note]Spring实战(v5)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring/05-note-spring5-qi-ye-ji-kai-fa-201907.html" class="sidebar-link">[Note]Spring5企业级开发实战</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Spring Boot</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Case</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring-boot/case/01--ji-chu-springboot--huan-jing-yu-bu-shu-cors-war.html" class="sidebar-link">[基础]SpringBoot-环境与部署(cors+war)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring-boot/case/02--shi-li-springboot-elasticsearch-ji-cheng.html" class="sidebar-link">[示例]SpringBoot-ElasticSearch集成</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring-boot/case/03--shi-li-springboot-redis-ji-cheng.html" class="sidebar-link">[示例]SpringBoot-Redis集成</a></li></ul></section></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring-boot/01--ji-chu-spring-boot.html" class="sidebar-link">[基础]Spring Boot</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/spring-boot/03-note-springboot2-shi-zhan-zhi-lu-2019.html" class="sidebar-link">[Note]SpringBoot2实战之旅</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Template</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><section class="sidebar-group is-sub-group depth-1"><p class="sidebar-heading open"><span>Notnow</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/notnow/01-jeesite4--jing-dian-hou-tai.html" class="sidebar-link">jeesite(经典后台)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/notnow/05-beetlplus--ji-xian-gai-zao.html" class="sidebar-link">beetlplus(极限改造)</a></li></ul></section></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/01-ruoyi--hou-tai-liang-xin.html" class="sidebar-link">ruoyi(后台良心)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/02-renren--si-huo-li-qi.html" class="sidebar-link">renren(私活利器)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/03-guns--ren-qiboot.html" class="sidebar-link">guns(人气Boot)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/04-macrozheng--quan-zhan-shang-cheng.html" class="sidebar-link">macrozheng(全栈商城)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/05-litemall--you-yi-shang-cheng.html" class="sidebar-link">litemall(又一商城)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/07-eladmin-jpa-li-xiang.html" class="sidebar-link">eladmin(JPA理想)</a></li><li><a href="/plana/nav.3.service-java/ch3-web-springboot/template/08-jeecg--kuai-su-jian-zhan.html" class="sidebar-link">jeecg(快速建站)</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="基础-javaweb-servlet-jsp"><a href="#基础-javaweb-servlet-jsp" class="header-anchor">#</a> [基础]JavaWeb(Servlet+JSP)</h1> <blockquote><p>@TODO @messy</p></blockquote> <ul><li>@doc
<ul><li><a href="https://weread.qq.com/web/reader/ea1329b07159a2f3ea1cec0" target="_blank" rel="noopener noreferrer">https://weread.qq.com/web/reader/ea1329b07159a2f3ea1cec0<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="https://weread.qq.com/web/reader/d68326e0719db0bcd684b6akc81322c012c81e728d9d180" target="_blank" rel="noopener noreferrer">https://weread.qq.com/web/reader/d68326e0719db0bcd684b6akc81322c012c81e728d9d180<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li><a href="https://weread.qq.com/web/reader/d4f328a0717f2b10d4f9a34" target="_blank" rel="noopener noreferrer">https://weread.qq.com/web/reader/d4f328a0717f2b10d4f9a34<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li></ul> <hr> <h1 id="jsp-java-servlet"><a href="#jsp-java-servlet" class="header-anchor">#</a> JSP = Java + Servlet</h1> <ul><li>JavaGuide-J2EE基础知识
<ul><li><a href="https://github.com/Snailclimb/JavaGuide/tree/master/docs/java" target="_blank" rel="noopener noreferrer">https://github.com/Snailclimb/JavaGuide/tree/master/docs/java<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li> <li>Java Web技术总结
<ul><li><a href="https://www.jianshu.com/p/539bdb7d6cfa" target="_blank" rel="noopener noreferrer">https://www.jianshu.com/p/539bdb7d6cfa<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li> <li>JSP程序设计 @old
<ul><li><a href="http://download.csdn.net/detail/gaoyuyihao/9249135" target="_blank" rel="noopener noreferrer">http://download.csdn.net/detail/gaoyuyihao/9249135<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li> <li>当Java遇见HTML @mooc @old
<ul><li><a href="http://www.jianshu.com/p/c7260f7588c5" target="_blank" rel="noopener noreferrer">http://www.jianshu.com/p/c7260f7588c5<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li></ul> <h1 id="jsp时代"><a href="#jsp时代" class="header-anchor">#</a> JSP时代</h1> <ul><li><p>html/xhtml/dhtml/shtml/jhtml的介绍和区别 @diff</p> <ul><li>Jsp是早期JHtml的加强版</li> <li>JHtml就是JSP的核心 两者互通，但也不可以说完全一样</li> <li><a href="http://www.aiuxian.com/article/p-931946.html" target="_blank" rel="noopener noreferrer">http://www.aiuxian.com/article/p-931946.html<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li></ul> <h1 id="jsp"><a href="#jsp" class="header-anchor">#</a> JSP</h1> <ul><li>jsp(java server page) 是另一种形式的servlet</li></ul> <h1 id="jsp基础"><a href="#jsp基础" class="header-anchor">#</a> JSP基础</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// Java里，类是最小单位，</span>
<span class="token comment">// 不允许在类外面定义变量和方法</span>
<span class="token comment">// 没有 全局变量 的概念 方法属性的权限修饰特点</span>
<span class="token comment">// 析构方法 finalize()</span>
<span class="token comment">// 强制类型转换 高级数据类型赋值给低级类型变量</span>

<span class="token comment">// Vector类</span>
一元集合，可以加入重复数据，
可以方便地对集合内的数据进行curd

<span class="token comment">// throw throws</span>
</code></pre></div><hr> <h1 id="servlet"><a href="#servlet" class="header-anchor">#</a> Servlet</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// Serlet</span>
服务端<span class="token class-name">Java</span> 
继承自javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span>http<span class="token punctuation">.</span><span class="token class-name">HttpServlet</span>类

<span class="token comment">// JavaBean</span>
独立的组件 
<span class="token comment">// 分可视化与不可视化</span>

<span class="token comment">// 为什么使用JSP </span>
JSP 安全性相对更高

预编译<span class="token punctuation">,</span> JSP页面在被服务器执行前<span class="token punctuation">,</span> 都是已经编译好的，
并且通常只进行一次编译<span class="token punctuation">,</span>所以相对执行速度也快<span class="token operator">?</span>

<span class="token comment">// JSP的处理过程...</span>
</code></pre></div><h1 id="servlet与其他语言-平台的比较"><a href="#servlet与其他语言-平台的比较" class="header-anchor">#</a> Servlet与其他语言/平台的比较</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// CGI </span>
<span class="token comment">// PHP</span>

<span class="token comment">// ASP COM组件 平台限制 -&gt; IIS</span>
ASP<span class="token punctuation">.</span>NET <span class="token class-name">Web</span> <span class="token class-name">Form</span> 强大的窗体
</code></pre></div><hr> <h1 id="开发模式"><a href="#开发模式" class="header-anchor">#</a> 开发模式</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// JSP程序开发模式</span>
纯JSP <span class="token operator">-&gt;</span>  JSP <span class="token operator">+</span> <span class="token class-name">JavaBean</span><span class="token punctuation">(</span>可重用<span class="token punctuation">)</span> <span class="token operator">-&gt;</span> JSP <span class="token operator">+</span> <span class="token class-name">Servlet</span><span class="token punctuation">(</span>类似分发器<span class="token punctuation">,</span>逻辑更好<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token class-name">JavaBean</span>

<span class="token comment">// MVC +  准备好的实用程序</span>
<span class="token operator">-&gt;</span> <span class="token class-name">Struts</span>等代表的框架模式 

<span class="token comment">// 大型网站 业务逻辑更复杂 EJB 难测试</span>
<span class="token operator">-&gt;</span> J2EE 

<span class="token comment">// EJB</span>
</code></pre></div><h1 id=""><a href="#" class="header-anchor">#</a> <img src="/static/images/java/j2ee-structure77283.png" alt=""></h1> <h1 id="servlet-2"><a href="#servlet-2" class="header-anchor">#</a> Servlet</h1> <div class="language-xml extra-class"><pre class="language-xml"><code>主要用于B/S结构,用来充当一个请求控制处理的角色

// Servlet使用
// 在web.xml中进行描述
在server 3.0中也可以通过注解进行配置

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>servlet</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>servlet-name</span><span class="token punctuation">&gt;</span></span>MyServlet<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>servlet-name</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>servlet-class</span><span class="token punctuation">&gt;</span></span>com.MyServlet<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>servlet-class</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>servlet</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>servlet-mapping</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>servlet-name</span><span class="token punctuation">&gt;</span></span>MyServlet<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>servlet-name</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url-pattern</span><span class="token punctuation">&gt;</span></span>/textServlet/*<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url-pattern</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>servlet-mapping</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>load-on-startup</span><span class="token punctuation">&gt;</span></span> 启动装入优先权

@WebServlet(&quot;/textServlet&quot;);
<span class="token comment">&lt;!-- http://localhost:8686/LearnServlet/textServlet --&gt;</span>
</code></pre></div><div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// Servlet作用特点</span>

<span class="token comment">// Servlet不仅可以生成HTML脚本</span>
<span class="token comment">// 也可以生成二进制表单进行输出</span>
<span class="token class-name">Servlet</span>可以是多参与者的游戏服务器
<span class="token comment">// 当允许单连接方式下进行数据传输时</span>
<span class="token comment">// applet</span>

<span class="token comment">// 当允许客户机和服务器简单、高效地执行会话的情况下</span>
通过定制协议进行通信

将定制的处理提供给所有服务器的标准程序
在各个程序之间共享数据

<span class="token comment">// Servlet的生命周期</span>
<span class="token class-name">Servlet</span>部署在容器里<span class="token punctuation">,</span> 它的生命周期由容器管理

<span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token class-name">HttpServletRequest</span> <span class="token class-name">HttpServletResponse</span> <span class="token operator">-&gt;</span> <span class="token function">sercive</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
destory

<span class="token comment">// Servlet与JSP的区别</span>
<span class="token class-name">Servlet</span>是服务端的<span class="token class-name">Applet</span>
<span class="token class-name">Servlet</span>必须编译后才能运行
JSP基于<span class="token class-name">Servlet</span>

<span class="token comment">// servlet实现请求的转发，还可以通过</span>
javax<span class="token punctuation">.</span>servlet<span class="token punctuation">.</span><span class="token class-name">RequestDispatcher</span>类的forward方法

<span class="token comment">// Servlet API编程常用接口和类</span>
<span class="token class-name">Servlet</span>接口
<span class="token class-name">HttpServlet</span>接口 针对<span class="token class-name">Web</span>服务器的<span class="token class-name">Servlet</span>
<span class="token comment">// ServletConfig接口 配置对象，初始化时传递信息</span>
<span class="token class-name">HttpServletRequest</span>接口
<span class="token class-name">HttpServletResponse</span>接口
<span class="token comment">// GenericServlet接口 抽象类</span>

<span class="token comment">// 用Servlet处理表单</span>
<span class="token comment">// Servlet过滤器 // 身份验证</span>
<span class="token comment">// Servlet监听器 // 实现同一用户只能有一个在线</span>
</code></pre></div><hr> <h1 id="jsp-语法"><a href="#jsp-语法" class="header-anchor">#</a> JSP-语法</h1> <ul><li>动作标识与指令标识</li></ul> <div class="language- extra-class"><pre class="language-text"><code>动作标识是在请求处理阶段按照在页面中出现的顺序被执行的,
只有在它们被执行的时候才会去执行自己所具有的的功能

而指令标识,
在JSP页面被执行是首先进入翻译阶段,
程序会先查找页面的指令标识并将它们转换成servlet,
所以这些指令标识会首先执行，从而设置整个JSP页面
</code></pre></div><div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// 指令</span>
page指令： 通常位于jsp页面的顶端，同一个页面可以有多个page指令。
include指令：将一个外部文件嵌入到jsp文件中。
taglib指令 ：使用标签定义新的自定义标签。

<span class="token operator">&lt;</span><span class="token operator">%</span>@ page 属性<span class="token operator">=</span><span class="token string">&quot;属性值&quot;</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">%</span>@ include file<span class="token operator">=</span><span class="token string">&quot;url&quot;</span> <span class="token operator">%</span><span class="token operator">&gt;</span>
</code></pre></div><div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// include动作</span>
<span class="token operator">&lt;</span>jsp<span class="token operator">:</span>include page<span class="token operator">=</span><span class="token string">&quot;url&quot;</span> flush<span class="token operator">=</span><span class="token string">&quot;true&quot;</span><span class="token operator">/</span><span class="token operator">&gt;</span>

<span class="token comment">// 转发请求 request对象会保留并带到目标页面</span>
<span class="token comment">// 不同于请求重定向</span>
<span class="token operator">&lt;</span>jsp<span class="token operator">:</span>forward page<span class="token operator">=</span><span class="token string">&quot;user.jsp&quot;</span><span class="token operator">&gt;</span>
  <span class="token operator">&lt;</span>jsp<span class="token operator">:</span>param name<span class="token operator">=</span><span class="token string">&quot;email&quot;</span>  value<span class="token operator">=</span><span class="token string">&quot;1233@154.com&quot;</span><span class="token operator">/</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>jsp<span class="token operator">:</span>forward<span class="token operator">&gt;</span>

plugin 
fallback 
param
codebase属性
</code></pre></div><ul><li>注释与脚本标识</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token operator">&lt;</span><span class="token operator">!</span><span class="token operator">--</span> html注释 <span class="token operator">--</span><span class="token operator">&gt;</span>                  <span class="token comment">// 客户端可见</span>
在HTML注释中可嵌入JSP表达式

隐藏注释 <span class="token operator">&lt;</span><span class="token operator">%</span><span class="token operator">--</span> jsp注释 <span class="token operator">--</span><span class="token operator">%</span><span class="token operator">&gt;</span>  <span class="token comment">// 客户端不可见</span>
<span class="token comment">// jsp 脚本单行注射          // 客户端不可见</span>
<span class="token comment">/* jsp 脚本多行注释 ) */</span>    <span class="token comment">// 客户端不可见</span>

<span class="token comment">// jsp脚本</span>
<span class="token operator">&lt;</span><span class="token operator">%</span>   java 代码 <span class="token operator">%</span><span class="token operator">&gt;</span>

<span class="token comment">// jsp声名</span>
<span class="token operator">&lt;</span><span class="token operator">%</span><span class="token operator">!</span>
 <span class="token class-name">String</span> s<span class="token operator">=</span><span class="token string">&quot;adele&quot;</span><span class="token punctuation">;</span>
 <span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span><span class="token keyword">int</span> y<span class="token punctuation">)</span><span class="token punctuation">{</span>
    <span class="token keyword">return</span> x<span class="token operator">+</span>y<span class="token punctuation">;</span>
 <span class="token punctuation">}</span>
<span class="token operator">%</span><span class="token operator">&gt;</span>

<span class="token comment">// jsp表达式</span>
<span class="token operator">&lt;</span><span class="token operator">%</span><span class="token operator">!</span>
 <span class="token class-name">String</span> s<span class="token operator">=</span><span class="token string">&quot;adele&quot;</span><span class="token punctuation">;</span>
<span class="token operator">%</span><span class="token operator">&gt;</span>
<span class="token generics"><span class="token punctuation">&lt;</span>h2<span class="token punctuation">&gt;</span></span>  hello<span class="token punctuation">,</span><span class="token operator">&lt;</span><span class="token operator">%=</span>s <span class="token operator">%</span><span class="token operator">&gt;</span> <span class="token operator">&lt;</span><span class="token operator">/</span>h2<span class="token operator">&gt;</span>
</code></pre></div><h1 id="include-动作和指令"><a href="#include-动作和指令" class="header-anchor">#</a> include 动作和指令</h1> <div class="language-java extra-class"><pre class="language-java"><code>如果要在JSP页面中显示大量的文本文字，可以将文字写入txt
再使用include指令或标识

但是include指令包含jsp文件
contentType要一直，否则报错
</code></pre></div><table><thead><tr><th>描述</th> <th>include指令</th> <th>include 动作</th></tr></thead> <tbody><tr><td>语法</td> <td>&lt; % @ include file=&quot;&quot;/&gt;</td> <td>&lt; jsp:include page=&quot;url&quot; flush=&quot;true&quot;/&gt;</td></tr> <tr><td>发生时间</td> <td>页面转换期间</td> <td>请求期间</td></tr> <tr><td>包含内容</td> <td>文件实际内容</td> <td>页面的输出</td></tr> <tr><td>转化servlet</td> <td>一个servlet</td> <td>2个servlet</td></tr> <tr><td>编译时间</td> <td>较慢</td> <td>较快</td></tr> <tr><td>执行时间</td> <td>稍快</td> <td>较慢--每次资源必须被编译</td></tr></tbody></table> <h1 id="jsp-生命周期"><a href="#jsp-生命周期" class="header-anchor">#</a> JSP-生命周期</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token function">jspService</span><span class="token punctuation">(</span><span class="token punctuation">)</span>是用来处理客户端请求的，
对于每一个请求，服务器会创建一个新的线程来处理该请求。
以多线程方式执行大大降低对系统的资源需求，
提高系统的并发量和缩短了响应时间

servlet是常驻在服务器内存中。
</code></pre></div><h1 id="jsp-内置对象"><a href="#jsp-内置对象" class="header-anchor">#</a> JSP-内置对象</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// BS进行交互通信的控制</span>
request 获取客户端的请求
response 对客户端进行响应
session
<span class="token comment">// HTTP是一种无状态协议</span>
<span class="token comment">// session对象是BS的连接一直保持下去</span>
<span class="token comment">// 销毁session invalidate()</span>
<span class="token comment">// 会话超时管理</span>

<span class="token comment">// 设置HTTP头可实现禁用缓存功能</span>
要在没有任何输出发送到客户端前使用
<span class="token operator">&lt;</span><span class="token operator">%</span>response<span class="token punctuation">.</span><span class="token function">setHeader</span><span class="token punctuation">(</span><span class="token string">&quot;Cache-Control&quot;</span><span class="token punctuation">,</span><span class="token string">&quot;no-store&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
response<span class="token punctuation">.</span><span class="token function">setDateHeader</span><span class="token punctuation">(</span><span class="token string">&quot;Expires&quot;</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">%</span><span class="token operator">&gt;</span>

<span class="token comment">// application</span>
WEB<span class="token operator">-</span>INF<span class="token operator">/</span>web<span class="token punctuation">.</span>xml

<span class="token comment">// out</span>
<span class="token comment">// flush() 刷新流</span>
<span class="token comment">// isAutoFlush()</span>

pageContext 获取会话范围  <span class="token comment">// 集大成者，通过它可以访问其他所有对象</span>

<span class="token comment">// config 读取web.xml配置信息</span>
<span class="token comment">// page 应答或请求</span>

exception exception<span class="token punctuation">.</span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</code></pre></div><h1 id="javabean的使用"><a href="#javabean的使用" class="header-anchor">#</a> Javabean的使用</h1> <ul><li><p>像普通的java类一样，创建javabean;</p> <ul><li>在jsp使用动作标签来使用 javaben</li></ul></li> <li><p>四大作用域</p> <ul><li>page ，仅当前页面有效</li> <li>request ,通过httpRequest.getAttribute()获取jvabean对象</li> <li>session httpSession.getAttribute()</li> <li>application 只要没有关闭服务器就会一直存在</li></ul></li></ul> <div class="language-html extra-class"><pre class="language-html"><code>当程序执行<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span><span class="token punctuation">&gt;</span></span>标识时，
会按照page request session application的顺序来查找Bean示例

getProperty
若指定值userName
那么Bean中必须存在getUserName()方法
</code></pre></div><div class="language-xml extra-class"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>useBwan</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span> <span class="token attr-name">scope</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span> <span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javabean 是例<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>*<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javabean 是例<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javaben 属性名<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javabean 是例<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javaben 属性名<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javabean 是例<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>javaben 属性名<span class="token punctuation">&quot;</span></span>  <span class="token attr-name">param</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>request对象参数<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>

<span class="token comment">&lt;!-- 跟request参数关联) --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>getProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span><span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
</code></pre></div><div class="language-html extra-class"><pre class="language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>useBean</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>com.po.Users<span class="token punctuation">&quot;</span></span> <span class="token attr-name">scope</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>page<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">&gt;</span></span>setProperty动作元素<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>hr</span><span class="token punctuation">&gt;</span></span>
   <span class="token comment">&lt;!--根据表单自动匹配所有的属性 --&gt;</span>
   &lt;%--
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>*<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>  
   --%&gt;
   <span class="token comment">&lt;!--根据表单匹配所有部分的属性 --&gt;</span>
   &lt;%--
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>username<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>  
   --%&gt;
   <span class="token comment">&lt;!--根表单无关，通过手工赋值给属性 --&gt;</span>
   &lt;%--
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>username<span class="token punctuation">&quot;</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>lisi<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>password<span class="token punctuation">&quot;</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>888888<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
   --%&gt;
   <span class="token comment">&lt;!--通过URL传参数给属性赋值 --&gt;</span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>username<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>setProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>password<span class="token punctuation">&quot;</span></span> <span class="token attr-name">param</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>mypass<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span>
   <span class="token comment">&lt;!-- 使用传统的表达式方式来获取用户名和密码 --&gt;</span>
   &lt;%--     
       用户名：&lt;%=myUsers.getUsername() %&gt;<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
       密码：&lt;%=myUsers.getPassword() %&gt;<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
   --%&gt;
   <span class="token comment">&lt;!-- 使用getProperty方式来获取用户名和密码 --&gt;</span>
      用户名：<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>getProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>username<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
      密码：<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">jsp:</span>getProperty</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>myUsers<span class="token punctuation">&quot;</span></span> <span class="token attr-name">property</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>password<span class="token punctuation">&quot;</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
   <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>br</span><span class="token punctuation">&gt;</span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>testScope.jsp<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>测试javabean的四个作用域范围<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">&gt;</span></span>
      &lt;%
         request.getRequestDispatcher(&quot;testScope.jsp&quot;).forward(request, response);
      %&gt;
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span>
</code></pre></div><h1 id="javabean"><a href="#javabean" class="header-anchor">#</a> JavaBean</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// JavaBean</span>
<span class="token class-name">JavaBean</span>组件与企业级<span class="token class-name">JavaBean</span><span class="token punctuation">(</span>EJB<span class="token punctuation">)</span>

实现java<span class="token punctuation">.</span>io<span class="token punctuation">.</span><span class="token class-name">Serializable</span>接口 序列化 <span class="token comment">// 考虑到不同的操作系统</span>
<span class="token comment">// JSP中的JavaBean不用实现这个接口</span>

<span class="token comment">// 类中必须存在一个无参数的构造函数</span>
<span class="token comment">// 索引属性 通过索引访问属性</span>

<span class="token comment">// 分为2类</span>
<span class="token comment">// 可以实现业务逻辑与页面显示的分离 @eg 转化 &lt; &gt;</span>
toolbean 
valuebean

<span class="token operator">&lt;</span>jsp<span class="token operator">:</span>setProperty<span class="token operator">&gt;</span>的property取值为 <span class="token operator">*</span> <span class="token comment">// 一 一赋予Bean中与参数具有相同名字的属性</span>

<span class="token comment">// Bound/Constrained 监听器</span>
主要是图形编程的<span class="token class-name">JavaBean</span>中 JSP较少用

<span class="token comment">// javabean实现邮箱验证</span>
<span class="token comment">// Javabean统计登录次数</span>
</code></pre></div><hr> <h1 id="cookie"><a href="#cookie" class="header-anchor">#</a> Cookie</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// 创建使用与读取</span>
<span class="token class-name">Cookie</span> cookie<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">Cookie</span><span class="token punctuation">(</span><span class="token class-name">String</span> <span class="token punctuation">,</span><span class="token class-name">Object</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
response<span class="token punctuation">.</span><span class="token function">addCookie</span><span class="token punctuation">(</span>cookie<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">Cookie</span><span class="token punctuation">[</span><span class="token punctuation">]</span> cookies<span class="token operator">=</span>request<span class="token punctuation">.</span><span class="token function">getCookies</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// cookie的常用方法</span>
<span class="token function">setMaxAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">setValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">getMaxAge</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h1 id="jstl"><a href="#jstl" class="header-anchor">#</a> JSTL</h1> <div class="language-java extra-class"><pre class="language-java"><code>$<span class="token punctuation">{</span>user<span class="token punctuation">[</span>user<span class="token operator">-</span>name<span class="token punctuation">]</span><span class="token punctuation">}</span>

<span class="token comment">// ignore的 2种方式</span>
page
web<span class="token punctuation">.</span>xml

<span class="token comment">// EL输出数组</span>
<span class="token comment">// EL获取表单 session JavaBean属性...</span>
<span class="token comment">// EL函数</span>

<span class="token comment">// JSTL</span>
<span class="token operator">&lt;</span>c<span class="token operator">:</span><span class="token keyword">catch</span><span class="token operator">&gt;</span> <span class="token comment">// 捕获异常</span>
<span class="token operator">&lt;</span>c<span class="token operator">:</span><span class="token keyword">import</span><span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>c<span class="token operator">:</span>url<span class="token operator">&gt;</span>
<span class="token operator">&lt;</span>c<span class="token operator">:</span>redirect<span class="token operator">&gt;</span>
</code></pre></div><h1 id="el表达式及标签"><a href="#el表达式及标签" class="header-anchor">#</a> EL表达式及标签</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token class-name">Expression</span> <span class="token class-name">Language</span> 表达式语言

计算和输出<span class="token class-name">Java</span>对象的简单语言
开发JSP应用程序的新途径

命名空间 <span class="token class-name">PageContext</span>对象
在EL中可以执行关系、逻辑、算数运算
扩展函数可以与<span class="token class-name">Java</span>类的静态方法进行映射
在表达式中可以访问JSP的<span class="token number">4</span>个作用域

isELIgnored<span class="token operator">=</span><span class="token string">&quot;true&quot;</span>

\$<span class="token punctuation">{</span><span class="token number">5</span><span class="token operator">+</span><span class="token number">3</span><span class="token punctuation">}</span> <span class="token comment">// 输出 ${5+3} 而不是 8</span>

<span class="token comment">// EL 运算符</span>
$<span class="token punctuation">{</span>user<span class="token punctuation">.</span>name<span class="token punctuation">}</span>  $<span class="token punctuation">{</span>user<span class="token punctuation">[</span>name<span class="token punctuation">]</span><span class="token punctuation">}</span>
$<span class="token punctuation">{</span> para<span class="token punctuation">,</span><span class="token punctuation">.</span>pwd1 <span class="token operator">==</span> param<span class="token punctuation">.</span>pwd2 <span class="token punctuation">}</span>

<span class="token comment">// 字符串连接</span>
$<span class="token punctuation">{</span><span class="token string">&quot;a&quot;</span><span class="token punctuation">}</span> $<span class="token punctuation">{</span><span class="token string">&quot;b&quot;</span><span class="token punctuation">}</span> <span class="token comment">// ${&quot;a&quot; + &quot;b&quot;} // 错误</span>

<span class="token comment">// EL的条件运算符功能比较弱, 用JSTL替代</span>

<span class="token comment">// EL表达式中的隐含对象</span>
pageContext隐含对象
访问环境信息的隐含对象
访问作用域范围的隐含对象

<span class="token comment">// EL表达式的保留字</span>
</code></pre></div><div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// JSTL标准标签库</span>
<span class="token class-name">JavaServer</span> <span class="token class-name">Pages</span> <span class="token class-name">Standard</span> <span class="token class-name">Tag</span> <span class="token class-name">Library</span>
取代传统JSP程序中嵌入<span class="token class-name">Java</span>代码的做法
提高程序的可维护性

核心标签库 ：表达式 条件 循环 URL操作
格式标签库 I18N 格式化数字和日期
SQL标签
XML标签库
函数标签库 字符串操作

<span class="token operator">&lt;</span>c<span class="token operator">:</span>set<span class="token operator">&gt;</span>的<span class="token number">4</span>种语法格式

<span class="token comment">// 自定义标签库的开发</span>
就是一个扩展的<span class="token class-name">Java</span>类

描述性的配置文件

加快<span class="token class-name">Web</span>应用开发的速度
代码重用
更加容易维护与升级

实现自定义的<span class="token class-name">Java</span>类文件 <span class="token operator">+</span> 自定义标签的TLD文件构成
<span class="token class-name">BodyTag</span>接口

<span class="token generics"><span class="token punctuation">&lt;</span>name<span class="token punctuation">&gt;</span></span> <span class="token operator">&lt;</span>tag<span class="token operator">-</span><span class="token keyword">class</span><span class="token operator">&gt;</span>建立自定义标签和映射类之间的对应关系

<span class="token comment">// JSP文件中引用自定义标签</span>
<span class="token operator">&lt;</span><span class="token operator">%</span>@ taglib uri<span class="token operator">=</span><span class="token string">&quot;/WEB-INF/showDate.tld&quot;</span> prefix<span class="token operator">=</span><span class="token string">&quot;taglib.prefix&quot;</span><span class="token operator">%</span><span class="token operator">&gt;</span>
或者在web<span class="token punctuation">.</span>xml中配置
</code></pre></div><hr> <h1 id="一些实用组件"><a href="#一些实用组件" class="header-anchor">#</a> 一些实用组件</h1> <ul><li>Common-FileUpload
<ul><li><a href="http://commons.apache.org/proper/commons-fileupload/" target="_blank" rel="noopener noreferrer">http://commons.apache.org/proper/commons-fileupload/<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// JSP文件操作</span>
<span class="token class-name">Common</span><span class="token operator">-</span><span class="token class-name">FileUpload</span> <span class="token comment">// 需要commons-io包的支持</span>

<span class="token comment">// enctype=&quot;multipart/form-data&quot;</span>
实现限制上传文件的类型
不使用组件实现 上传下载
</code></pre></div><ul><li>XML操作</li> <li>Java Mail发送E-mail</li> <li>JSP动态图表 JFreeChat</li> <li>JSP报表</li></ul> <hr> <h1 id="数据库操作"><a href="#数据库操作" class="header-anchor">#</a> 数据库操作</h1> <ul><li>JSP连接JSTL-MySQL
<ul><li><a href="http://www.runoob.com/jsp/jsp-database-access.html" target="_blank" rel="noopener noreferrer">http://www.runoob.com/jsp/jsp-database-access.html<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li></ul></li></ul> <h1 id="jdbc"><a href="#jdbc" class="header-anchor">#</a> JDBC</h1> <ul><li>JDBC</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// JDBC</span>
驱动程序接口<span class="token class-name">Driver</span>
java<span class="token punctuation">.</span>sql<span class="token punctuation">.</span><span class="token class-name">Driver</span>

驱动程序管理器<span class="token class-name">DriverManager</span>
<span class="token class-name">Connection</span>
<span class="token class-name">Statement</span>
执行动态SQL语句接口 <span class="token class-name">PreparedStatement</span>
执行存储过程接口 <span class="token class-name">CallableStatement</span>
<span class="token class-name">Resulset</span>

<span class="token comment">// JDBC缺点</span>
访问数据库速度
JDBC API是面向对象的，
但是通过JDBC访问数据库依然是面向关系的

<span class="token comment">// JDBC驱动程序</span>
JDBC<span class="token operator">-</span>ODBC <span class="token class-name">Bridge</span>
必须将ODBC二进制代码加载到使用该驱动程序的每个客户机上
最适合企业网
<span class="token class-name">Java</span>编写的<span class="token number">3</span>层结构的应用程序服务代码

JDBC<span class="token operator">-</span><span class="token class-name">Native</span> API <span class="token class-name">Bridge</span>
调用本地的<span class="token keyword">native</span>程序

JDBC<span class="token operator">-</span>middleware
完全利用<span class="token class-name">Java</span>编写的JDBC驱动
最为灵活
必须处理<span class="token class-name">Web</span>所提出的安全性
通过防火墙访问

<span class="token class-name">Pure</span> JDBC <span class="token class-name">Driver</span>
专用
</code></pre></div><p><img src="/static/images/java/orm.jpg" alt=""></p> <h1 id="数据库-连接池"><a href="#数据库-连接池" class="header-anchor">#</a> 数据库-连接池</h1> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// 连接池技术</span>
预先先建立好一定数量的数据库连接
模拟存放在一个连接池中
由连接池负责对这些数据库连接进行管理

免去每次在访问数据库之前建立数据库连接开销

同时这项技术解决了数据库连接数量限制的问题

要及时调用<span class="token class-name">Connection</span>对象的<span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span>或<span class="token function">dispose</span><span class="token punctuation">(</span><span class="token punctuation">)</span>方法显式关闭连接

要求开发人员准确估算系统需要提供的最大数据库连接的数量
</code></pre></div><ul><li>在Tomcat中配置连接池</li></ul> <div class="language-java extra-class"><pre class="language-java"><code>sqljdbc等jar
META<span class="token operator">-</span>INF\context<span class="token punctuation">.</span>xml
JNDI <span class="token class-name">Jav</span>命名与目录接口
</code></pre></div><hr> <h1 id="jsp与ajax"><a href="#jsp与ajax" class="header-anchor">#</a> JSP与AJAX</h1> <ul><li>AJAX实现注册时用户名的查重</li> <li>AJAX级联</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">// 中文乱码 utf-8</span>
<span class="token class-name">String</span> name <span class="token operator">=</span> request<span class="token punctuation">.</span><span class="token function">getParameter</span><span class="token punctuation">(</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">&quot;姓名&quot;</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>name<span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token string">&quot;iso-8859-1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token string">&quot;utf-8&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div><h1 id="接口的权限认证"><a href="#接口的权限认证" class="header-anchor">#</a> 接口的权限认证</h1> <ul><li>拦截器 HandlerInterceptorAdapter</li></ul> <h1 id="接口层应该实现如下目标"><a href="#接口层应该实现如下目标" class="header-anchor">#</a> 接口层应该实现如下目标</h1> <ul><li>统一的响应体、请求体，规避Map、List作参数或者响应结果的方式</li> <li>统一的错误信息</li> <li>统一的请求数据校验</li> <li>统一的接口异常捕获</li></ul> <hr> <h1 id="mysql建表"><a href="#mysql建表" class="header-anchor">#</a> MySQL建表</h1> <ul><li><p>按照字段的使用频率依次定义</p></li> <li><p>可为空的字段要提供默认值；</p></li> <li><p>id + gmt_create + gmt_modified</p></li> <li><p>索引和约束</p> <ul><li>组合索引</li></ul></li></ul> <h1 id="线程池"><a href="#线程池" class="header-anchor">#</a> 线程池</h1> <ul><li><p>线程池的大小</p> <ul><li>根据Little定律（队列中任务的平均数量等于进入速率和平均停留时间的乘积）估算</li></ul></li></ul> <hr> <h1 id="一些开发建议"><a href="#一些开发建议" class="header-anchor">#</a> 一些开发建议</h1> <ul><li>别返回null值</li></ul> <div class="language-java extra-class"><pre class="language-java"><code>当一个方法返回<span class="token class-name">Collection</span>集合的时候，不要返回<span class="token keyword">null</span>
如果没有结果则返回空的集合（例如：<span class="token class-name">Collections</span><span class="token punctuation">.</span><span class="token function">emptyList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
这样该方法的客户就不需要判断 <span class="token keyword">null</span>的逻辑
这就是<span class="token class-name">Java</span>开发中的特例模式的应用
</code></pre></div><ul><li>在通过URL参数传入时间时，后台可考虑使用InitBinder自动将时间字符串转换成Date对象，并绑定到Controller的入参</li></ul> <div class="language-java extra-class"><pre class="language-java"><code><span class="token comment">//the parameter was converted in initBinder</span>
<span class="token annotation punctuation">@RequestMapping</span><span class="token punctuation">(</span><span class="token string">&quot;/date&quot;</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">date</span><span class="token punctuation">(</span><span class="token class-name">Date</span> date<span class="token punctuation">)</span><span class="token punctuation">{</span>
 <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>date<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token string">&quot;hello&quot;</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">//At the time of initialization,convert the type &quot;String&quot; to type &quot;date&quot; @InitBinder</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">initBinder</span><span class="token punctuation">(</span><span class="token class-name">ServletRequestDataBinder</span> binder<span class="token punctuation">)</span><span class="token punctuation">{</span>
  binder<span class="token punctuation">.</span><span class="token function">registerCustomEditor</span><span class="token punctuation">(</span><span class="token class-name">Date</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">CustomDateEditor</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SimpleDateFormat</span><span class="token punctuation">(</span><span class="token string">&quot;yyyy-MM-dd&quot;</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><ul><li>只要涉及到字符串，就要明确该字符串用什么编码，要显式指明！不要相信默认值</li></ul> <div class="language-bash extra-class"><pre class="language-bash"><code>IOUtils.toString<span class="token punctuation">(</span>in, Charset.forName<span class="token punctuation">(</span><span class="token string">&quot;UTF-8&quot;</span><span class="token punctuation">))</span><span class="token punctuation">;</span>
</code></pre></div><hr> <h1 id="参考"><a href="#参考" class="header-anchor">#</a> 参考</h1> <ul><li>《Java Web开发实践教程》 @by 王占中 崔志刚</li></ul></div> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
      ←
      <a href="/plana/nav.3.service-java/ch3-web-springboot/" class="prev router-link-active">
        README
      </a></span> <span class="next"><a href="/plana/nav.3.service-java/ch3-web-springboot/02-note--shen-ru-fen-xijavaweb-ji-shu-nei-mu-201408.html">
        [Note]深入分析Java Web技术内幕
      </a>
      →
    </span></p></div> </main></div><div class="global-ui"></div></div>
    <script src="/plana/assets/js/app.26a35d46.js" defer></script><script src="/plana/assets/js/2.b5bc497d.js" defer></script><script src="/plana/assets/js/81.c563629a.js" defer></script>
  </body>
</html>
